package com.example.flowabledemo.conf;

import org.flowable.engine.delegate.DelegateExecution;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * 完成任务
 */
@Component
public class EmployeeVoteTaskCompleteConfig {

    private static final Logger logger = LoggerFactory.getLogger(EmployeeVoteTaskCompleteConfig.class);

    /**
     * 任务的执行实例监听器
     * 任务配置：【员工投票】-完成条件(多实例) : ${employeeVoteTaskCompleteConfig.completeTaskTo(execution)}
     *
     * @param execution 执行实例
     * @return {true: 结束会签任务；false: 继续会签任务}
     */
    public boolean completeTaskTo(DelegateExecution execution) {
        Object result = execution.getVariable("result");
        if (result.equals(0)) {
            logger.info("当前任务（{}）有人审批不通过，结束会签任务", execution.getCurrentFlowElement().getName());
            //设置会签结果 排他网关使用
            return true;
        }
        if (!result.equals(1)) {
            throw new IllegalArgumentException("不识别的流程变量取值: " + result);
        }
        Integer nrOfInstances = (Integer) execution.getVariable("nrOfInstances");
        logger.info("任务会签总数：" + nrOfInstances);
        logger.info("待会签任务数量：" + execution.getVariable("nrOfActiveInstances"));
        logger.info("已完成会签任务数量：" + execution.getVariable("nrOfCompletedInstances"));

        // 获取同意人数
        Object agreeObj = execution.getVariable("agree");
        if (agreeObj == null) {
            execution.setVariable("agree", 1);
            logger.info("当前同意人数为{}, 增加同意人数为：{}", 0, 1);
        } else {
            execution.setVariable("agree", (Integer) agreeObj + 1);
            logger.info("当前同意人数为{}, 增加同意人数为：{}", agreeObj, (Integer) agreeObj + 1);
        }
        // 最终的同意人数
        Integer agree = (Integer) execution.getVariable("agree");
        logger.info("当前审批通过的人数: {}", execution.getVariable("agree"));
        if (agree.equals(nrOfInstances)) {
            logger.info("审批通过的人数（{}）为达到任务会签总数（{}），结束会签任务（{}）", agree, nrOfInstances, execution.getCurrentFlowElement().getName());
            //设置会签结果 排他网关使用wanm
            return true;
        }
        logger.info("当前审批通过的人数（{}），还未达到任务会签总数（{}），继续会签任务（{}）", agree, nrOfInstances, execution.getCurrentFlowElement().getName());
        //设置会签结果 排他网关使用
        return false;
    }

}

